# 日志配置
import logging
import logging.handlers
import os
from pathlib import Path


def setup_logging():
    """设置应用日志配置"""

    # 创建日志目录
    log_dir = Path("logs")
    log_dir.mkdir(exist_ok=True)

    # 设置日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

    # 设置根日志记录器
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)

    # 清除现有处理器
    root_logger.handlers.clear()

    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.INFO)
    root_logger.addHandler(console_handler)

    # 文件处理器 - 所有日志
    file_handler = logging.handlers.RotatingFileHandler(
        log_dir / "app.log",
        maxBytes=10 * 1024 * 1024,  # 10MB
        backupCount=5,
        encoding='utf-8'
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)
    root_logger.addHandler(file_handler)

    # 错误日志文件处理器
    error_handler = logging.handlers.RotatingFileHandler(
        log_dir / "error.log",
        maxBytes=10 * 1024 * 1024,  # 10MB
        backupCount=5,
        encoding='utf-8'
    )
    error_handler.setFormatter(formatter)
    error_handler.setLevel(logging.ERROR)
    root_logger.addHandler(error_handler)

    # HTTP请求日志
    http_logger = logging.getLogger("http_requests")
    http_handler = logging.handlers.RotatingFileHandler(
        log_dir / "http_requests.log",
        maxBytes=10 * 1024 * 1024,  # 10MB
        backupCount=5,
        encoding='utf-8'
    )
    http_handler.setFormatter(formatter)
    http_logger.addHandler(http_handler)
    http_logger.setLevel(logging.INFO)
    # 防止重复记录到根记录器
    http_logger.propagate = False

    # 数据库日志
    db_logger = logging.getLogger("sqlalchemy.engine")
    if os.getenv("DEBUG", "false").lower() == "true":
        db_logger.setLevel(logging.INFO)
    else:
        db_logger.setLevel(logging.WARNING)

    # 禁用一些过于详细的日志
    logging.getLogger("urllib3.connectionpool").setLevel(logging.WARNING)
    logging.getLogger("requests.packages.urllib3").setLevel(logging.WARNING)

    print(f"✅ 日志系统初始化完成，日志目录: {log_dir.absolute()}")


def get_logger(name: str) -> logging.Logger:
    """获取指定名称的日志记录器"""
    return logging.getLogger(name)


def setup_module_logger(name: str) -> logging.Logger:
    """
    为模块设置日志记录器，自动配置控制台和文件输出
    
    Args:
        name: 模块名称，通常使用 __name__
        
    Returns:
        配置好的日志记录器
    """
    # 获取模块日志记录器
    module_logger = logging.getLogger(name)
    module_logger.setLevel(logging.INFO)

    # 如果已经有处理器，直接返回（避免重复添加）
    if module_logger.handlers:
        return module_logger

    # 设置日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.INFO)
    module_logger.addHandler(console_handler)

    # 创建日志目录
    log_dir = Path("logs")
    log_dir.mkdir(exist_ok=True)

    # 添加文件处理器
    file_handler = logging.handlers.RotatingFileHandler(
        log_dir / f"{name.replace('.', '_')}.log",
        maxBytes=5 * 1024 * 1024,  # 5MB
        backupCount=3,
        encoding='utf-8'
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)
    module_logger.addHandler(file_handler)

    # 防止向父记录器传播（避免重复记录）
    module_logger.propagate = False

    return module_logger
